package com.example.model;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.ArrayList;
import java.util.List;

/**
 * BallView类
 */
public class BallView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
    private SurfaceHolder mHolder;
    private Thread mThread;
    /**
     * mIsRunning是用来控制线程的开启和关闭的一个参数
     * 在多线程中我们需要使用while不断进行绘制，所以比较安全的处理线程的方法就是
     * 用这样的一个变量来控制while的条件
     */
    private boolean mIsRunning;
    private List<Ball> mBalls;

    /**
     * BallView类的构造函数
     * @param context
     */
    public BallView(Context context) {
        super(context);
        mHolder = getHolder();
        mHolder.addCallback(this);
        mBalls = new ArrayList<>();
        // 初始化小球
        for (int i = 0; i < 5; i++) {
            float x = (float) (Math.random() * getWidth());
            float y = (float) (Math.random() * getHeight());
            float r = (float) (Math.random() * 50 + 50);
            float vx = (float) (Math.random() * 20 - 10);
            float vy = (float) (Math.random() * 20 - 10);
            int color = Color.YELLOW;   // 设置小球的颜色为黄色
            Ball ball = new Ball(x, y, r, vx, vy, color);
            mBalls.add(ball);
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mIsRunning = true;
        mThread = new Thread(this);
        mThread.start();
    }

    /**
     * 这个是对surfaceCreated方法中的线程的执行流程的具体实现
     * 这里是用一个线程来集中管理一次呢性创建的好几个球
     * 具体的绘制是使用Canves类来进行绘制的
     */
    @Override
    public void run() {
        while (mIsRunning) {
            Canvas canvas = mHolder.lockCanvas();
            if (canvas != null) {
                canvas.drawColor(Color.RED);
                for (Ball ball : mBalls) {
                    // 在此处处理小球的位置移动和画面的更新
                    ball.move(getWidth(), getHeight());
                    ball.draw(canvas);
                }
                mHolder.unlockCanvasAndPost(canvas);
            }
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mIsRunning = false;
        try {
            mThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 这个是关于小球的碰撞检测的函数
     */
    public void checkCollision() {

    }
}